﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Library.Data.Security.Encryption;

namespace UnigenReport.Form
{
    public partial class ucProductEdit : UserControl
    {
        private Product refData;
        private UnigenDataContext db;
        private bool action;//True: Add, False: Update

        #region Thiết lập

        public ucProductEdit()
        {
            InitializeComponent();
            //Phân quyền
            if (Variables.UserRoleID == 0) btnSave.Enabled = false;
            SetEvent();

            action = true;     
        }

        /// <summary>
        /// Hàm show ra ngoài cho việc update
        /// </summary>
        /// <param name="refData"></param>
        /// <returns></returns>
        public ucProductEdit ForUpdate(Product obj)
        {
            refData = obj;
            action = false;
            return this;
        }

        /// <summary>
        /// Khai báo các sự kiện
        /// </summary>
        private void SetEvent()
        {
            Load += OnLoad;
            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
        }
        
        /// <summary>
        /// Hàm load form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnLoad(object sender, EventArgs e)
        {
            //Load default
            SetDefault();
        }
        
        /// <summary>
        /// Thiết lập các giá trị mặc định của form
        /// </summary>
        private void SetDefault()
        {
            db = new UnigenDataContext();

            //Lấy các nguồn phụ trợ
            sourceUnit.DataSource = db.Units;

            //Bind dữ liệu chính
            BindData();
        }

        /// <summary>
        /// Lấy dữ liệu chính
        /// </summary>
        private void BindData()
        {
            try
            {
                //Data bind
                if (refData != null)
                {
                    pnlTitle.Text = "SỬA ĐỔI THÔNG TIN MẶT HÀNG";
                    txtProductCode.Text = refData.ProductCode;
                    txtProductName.Text = refData.ProductName;
                    txtProductNameVi.Text = refData.ProductNameVi;
                    cboUnit.SelectedValue = refData.UnitId;
                    txtCost.Value = refData.Cost ?? 0;
                    txtSalePrice.Value = refData.SalePrice ?? 0;
                    txtHSCode.Text = refData.HSCode;
                    txtUhanCodeUsing.Text = refData.UhanCodeUsing;
                }
                else
                    pnlTitle.Text = "THÊM MỚI MẶT HÀNG";
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("BindData - " + ex.Message);
            }
        }

        #endregion

        #region Hàm

        private void Save()
        {
            try
            {
                var productCode = txtProductCode.Text.Trim();
                var productName = txtProductName.Text.Trim();
                var productNameVi = txtProductNameVi.Text.Trim();
                var unit = Convert.ToInt16(cboUnit.SelectedValue);
                var cost = txtCost.Value;
                var salePrice = txtSalePrice.Value;
                var hsCode = txtHSCode.Text.Trim();
                var uhanCodeUsing = txtUhanCodeUsing.Text.Trim();

                #region Check valid
                if (String.IsNullOrEmpty(productCode))
                {
                    Common.ShowNoticeMess("Nhập mã mặt hàng!");
                    return;
                }
                if (db.Products.Count(i => i.ProductCode == productCode) > 0 && action)
                {
                    Common.ShowNoticeMess("Mã mặt hàng đã tồn tại!");
                    return;
                }
                if (String.IsNullOrEmpty(productName))
                {
                    Common.ShowNoticeMess("Nhập English name!");
                    return;
                }
                if (unit < 1)
                {
                    Common.ShowNoticeMess("Chọn đơn vị tính!");
                    return;
                }
                #endregion

                db = new UnigenDataContext();
                var p = new Product();
                if (action)//Thêm mới
                {
                    p.ProductCode = productCode;
                    p.ProductName = productName;
                    p.ProductNameVi = productNameVi;
                    p.UnitId = unit;
                    p.Cost = cost;
                    p.SalePrice = salePrice;
                    p.HSCode = hsCode;
                    p.UhanCodeUsing = uhanCodeUsing;
                    p.Active = true;

                    //Thêm thông tin
                    db.Products.InsertOnSubmit(p);
                }
                else
                {
                    //Cập nhật thông tin
                    p = db.Products.SingleOrDefault(pt => pt.ProductId == refData.ProductId);
                    if (p != null)
                    {
                        p.ProductCode = productCode;
                        p.ProductName = productName;
                        p.ProductNameVi = productNameVi;
                        p.UnitId = unit;
                        p.Cost = cost;
                        p.SalePrice = salePrice;
                        p.HSCode = hsCode;
                        p.UhanCodeUsing = uhanCodeUsing;
                    }
                }

                //Xác nhận
                db.SubmitChanges();

                //Thông báo
                this.ParentForm.DialogResult = DialogResult.OK;
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("Save - " + ex.Message);
            }
        }        

        #endregion

        #region Sự kiện

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Enter && !btnSave.Focused && !btnCancel.Focused)
            {
                Save();
            }
            if (keyData == Keys.Escape)
            {
                this.ParentForm.DialogResult = DialogResult.Cancel;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            Save();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.ParentForm.DialogResult = DialogResult.Cancel;
        }

        #endregion

    }
}
